a11y: Make GtkATContext realization lazier
authorEmmanuele Bassi <ebassi@gnome.org>
Thu, 21 Jan 2021 16:39:22 +0000 (16:39 +0000)
committerEmmanuele Bassi <ebassi@gnome.org>
Thu, 21 Jan 2021 16:40:57 +0000 (16:40 +0000)
We only realize the ATContext on the top level, which will create an
GtkAtSpiRoot object and the corresponding GtkAtSpiCache object. Whenever
an AT connects to the accessibility bus, and asks for the various
objects, all the ATContext will be realized on demand.

gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/gtkwindow.c

index 5ac8b9ac84843a2a62ebd215b3ccddd52974b3a9..217293cd231f50509a26b9d557e2a9e3f0d30431 100644 (file)
@@ -2374,7 +2374,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->at_context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
 }
 
-static void
+void
 gtk_widget_realize_at_context (GtkWidget *self)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (self);
@@ -2383,10 +2383,6 @@ gtk_widget_realize_at_context (GtkWidget *self)
   if (priv->at_context == NULL || gtk_at_context_is_realized (priv->at_context))
     return;
 
-  /* Realize the root ATContext first */
-  if (!GTK_IS_ROOT (self))
-    gtk_widget_realize_at_context (GTK_WIDGET (priv->root));
-
   /* Reset the accessible role to its current value */
   if (role == GTK_ACCESSIBLE_ROLE_WIDGET)
     {
@@ -2400,6 +2396,18 @@ gtk_widget_realize_at_context (GtkWidget *self)
   gtk_at_context_realize (priv->at_context);
 }
 
+void
+gtk_widget_unrealize_at_context (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  if (priv->at_context != NULL)
+    {
+      gtk_at_context_set_display (priv->at_context, gdk_display_get_default ());
+      gtk_at_context_unrealize (priv->at_context);
+    }
+}
+
 void
 gtk_widget_root (GtkWidget *widget)
 {
@@ -2428,8 +2436,6 @@ gtk_widget_root (GtkWidget *widget)
   if (priv->layout_manager)
     gtk_layout_manager_set_root (priv->layout_manager, priv->root);
 
-  gtk_widget_realize_at_context (widget);
-
   GTK_WIDGET_GET_CLASS (widget)->root (widget);
 
   if (!GTK_IS_ROOT (widget))
@@ -2454,12 +2460,6 @@ gtk_widget_unroot (GtkWidget *widget)
 
   GTK_WIDGET_GET_CLASS (widget)->unroot (widget);
 
-  if (priv->at_context != NULL)
-    {
-      gtk_at_context_set_display (priv->at_context, gdk_display_get_default ());
-      gtk_at_context_unrealize (priv->at_context);
-    }
-
   if (priv->context)
     gtk_style_context_set_display (priv->context, gdk_display_get_default ());
 
index eb6959fe7ce64ea7c8001706dd7b58b6fe4e0b26..9848d4038f3823dbf023956e130dc7dc8fa43254 100644 (file)
@@ -373,6 +373,9 @@ gboolean gtk_widget_focus_self       (GtkWidget        *widget,
 void    gtk_widget_update_orientation   (GtkWidget      *widget,
                                          GtkOrientation  orientation);
 
+void    gtk_widget_realize_at_context   (GtkWidget *widget);
+void    gtk_widget_unrealize_at_context (GtkWidget *widget);
+
 /* inline getters */
 
 static inline GtkWidget *
index d704f497b1abb2ce01d1f9d791f69465be5759cb..06835dc99ccd7fc0f4b67869f381bc2b097ee125 100644 (file)
@@ -3806,6 +3806,8 @@ gtk_window_map (GtkWidget *widget)
 
   if (priv->application)
     gtk_application_handle_window_map (priv->application, window);
+
+  gtk_widget_realize_at_context (widget);
 }
 
 static void
@@ -3818,6 +3820,8 @@ gtk_window_unmap (GtkWidget *widget)
   GTK_WIDGET_CLASS (gtk_window_parent_class)->unmap (widget);
   gdk_surface_hide (priv->surface);
 
+  gtk_widget_unrealize_at_context (widget);
+
   if (priv->title_box != NULL)
     gtk_widget_unmap (priv->title_box);